﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Windows.Forms;

namespace LectorExpediciones
{
    public class GestorConexion
    {
        private static GestorConexion instancia;
        private OleDbConnection conexion;

        private GestorConexion() {
            string path = System.IO.Directory.GetCurrentDirectory();

            IniFile lector = new IniFile(path + "/configuracion.ini");
            string bbdd = lector.IniReadValue("Configuracion", "rutaBaseDatos");
            if (bbdd == "")
            {
                MessageBox.Show("No se encuentra el fichero de configuracion 'configuraion.ini'. Por favor, adjunte el fichero en la carpeta del ejecutable."
                    , "Error al intentar cargar la configuración del programa", MessageBoxButtons.OK);                
            }
            conexion = new OleDbConnection(@"Provider=Microsoft.Jet.OlEDB.4.0;Data Source= " + bbdd + ";Persist Security Info=True");
            

            try
            {
                conexion.Open();
            }
            catch (Exception e)
            {
                MessageBox.Show("Error de conexión a base de datos: " + e.Message + "\nPor favor, compruebe la configuración de ruta al fichero de base de datos"
                    , "Error al intentar conectar con la base de datos", MessageBoxButtons.OK);
                    
            }
            finally
            {
                conexion.Close();
            }


        }

        public void borrarRegistrosLotesExpedicion(Expedicion expedicion)
        {
            OleDbConnection conexion = getConexion();

            string sql = "delete from DetallesExpedicion where dexNumeroExpedicion = " + expedicion.getId().ToString();
            OleDbCommand cmd = new OleDbCommand(sql, conexion);

            try
            {
                conexion.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
            finally
            {
                conexion.Close();
            }
        }

        public List<Expedicion> getExpediciones()
        {
            OleDbConnection conexion = GestorConexion.getInstancia().getConexion();
            List<Expedicion> listaExpediciones = new List<Expedicion>();
            string selectSQL = "select * from Expediciones where expCerrada = 0";
            OleDbCommand cmd = new OleDbCommand(selectSQL, conexion);
            OleDbDataReader reader;
            try
            {
                conexion.Open();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Object objetoComparador;
                    
                    Expedicion expedicion = new Expedicion();
                    objetoComparador = reader["expNumero"];
                    if (objetoComparador.GetType() != typeof(System.DBNull))
                    {
                        int id = (int)reader["expNumero"];
                        expedicion.setId((long)id);
                    }

                    objetoComparador = reader["expComentario"];
                    if (objetoComparador.GetType() != typeof(System.DBNull))
                    {
                        string comentario = (string)reader["expComentario"];
                        expedicion.setComentario(comentario);
                    }

                    objetoComparador = reader["expCodigoCliente"];
                    if (objetoComparador.GetType() != typeof(System.DBNull))
                    {
                        string codigo = (string)reader["expCodigoCliente"];
                        expedicion.setCliente(obtenerNombreCliente((codigo)));
                    }

                    objetoComparador = reader["expFecha"];
                    if (objetoComparador.GetType() != typeof(System.DBNull))
                    {
                        DateTime fecha = (DateTime)reader["expFecha"];
                        expedicion.setFecha(fecha);
                    }


                    listaExpediciones.Add(expedicion);
                   
                }
                reader.Close();
            }
            catch (Exception e)
            {
                string textoError = e.Message;
            }
            finally
            {
                conexion.Close();
            }
            return listaExpediciones;
        }

        public static GestorConexion getInstancia()
        {
           
            if (instancia == null)
            {
                instancia = new GestorConexion();
            }
            return instancia;
            
        }

        public OleDbConnection getConexion()
        {
            if (conexion == null)
            {
                return null;
            }
            return conexion;            
        }

        public Pallet getPallet(long id)
        {
            Pallet pallet = null;
            bool noCerrar = false;
            try
            {
                if (conexion.State == System.Data.ConnectionState.Closed)
                    conexion.Open();
                else
                    noCerrar = true;
                string sql = "select * from Lotes where lotNumero = " + id;
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                OleDbDataReader reader;
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    DateTime fecha;
                    string codZona;
                    double tara;
                    double pesoBruto;
                    double pesoNeto;
                    bool expedido;

                    pallet = new Pallet();
                    int idPallet = (int)reader["lotNumero"];
                    pallet.setId(idPallet);

                    Object objetoRecogedor = reader["lotCodigoBarras"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {
                        string codBarras = (string)reader["lotCodigoBarras"];
                        pallet.setCodigoBarras(codBarras);

                    }
                                        
                    objetoRecogedor = reader["lotCodigoArticulo"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {
                        string codigo = (string)reader["lotCodigoArticulo"];
                        pallet.setCodigo(obtenerNombreProducto(codigo));
                    }
                    
                    objetoRecogedor = reader["lotFecha"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {
                        fecha = (DateTime)reader["lotFecha"];
                        pallet.setFecha(fecha);
                    }

                    objetoRecogedor = reader["lotCodigoZona"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {
                        codZona = (string)reader["lotCodigoZona"];
                        pallet.setCodigoZona(codZona);
                    }

                    objetoRecogedor = reader["lotTara"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {
                        tara = (double)reader["lotTara"];
                        pallet.setTara(tara);
                    }

                    objetoRecogedor = reader["lotPesoBruto"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {
                        pesoBruto = (double)reader["lotPesoBruto"];
                        pallet.setPesoBruto(pesoBruto);
                    }

                    objetoRecogedor = reader["lotPesoNeto"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {                     
                        pesoNeto = (double)reader["lotPesoNeto"];
                        pallet.setPesoNeto(pesoNeto);
                    }

                    objetoRecogedor = reader["lotExpedido"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                    {
                        expedido = (bool)reader["lotExpedido"];
                        pallet.setExpedido(expedido);
                    }
                    
                    
                }
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
            finally
            {
                if (!noCerrar)
                    conexion.Close();
            }
            return pallet;
        }

        public Pallet ExistePallet(string p)
        {
           
            Pallet pallet = null;
            try
            {
                conexion.Open();
                string sql = "select * from Lotes where lotCodigoBarras like ('%" + p + "%')";
                 OleDbCommand cmd = new OleDbCommand(sql, conexion);
                 OleDbDataReader reader;
                 reader = cmd.ExecuteReader();

                 while (reader.Read())
                 {
                     pallet = new Pallet();
                     int id = (int)reader["lotNumero"];
                     string codigo = (string)reader["lotCodigoBarras"];

                     bool expedido = (bool)reader["lotExpedido"];
                     string codigoArticulo = (string)reader["lotCodigoArticulo"];

                     Object objetoRecogedor = reader["lotPesoNeto"];
                     double pesoNeto;
                     if (objetoRecogedor.GetType() != typeof(System.DBNull))
                     {
                         pesoNeto = (double)reader["lotPesoNeto"];
                         pallet.setPesoNeto(pesoNeto);
                     }

                     pallet.setExpedido(expedido);                     
                     pallet.setId(id);
                     pallet.setCodigoBarras(codigo);
                     pallet.setCodigo(obtenerNombreProducto(codigoArticulo));
                 }
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
            finally
            {
                conexion.Close();
            }
            return pallet;
        }

        public ExpedicionPallets getExpedicionPallets(Expedicion expedicion)
        {
            ExpedicionPallets expedicionPallets = new ExpedicionPallets(expedicion);            
            try
            {
                conexion.Open();
                string sql = "select dexNumeroLote from DetallesExpedicion where dexNumeroExpedicion = " + expedicion.getId().ToString();
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                OleDbDataReader reader;
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    long idPallet = (long)reader.GetInt32(0);
                    Pallet pallet = getPallet(idPallet);
                    expedicionPallets.addPallet(pallet);
                }
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
            finally
            {
                conexion.Close();
            }
            return expedicionPallets;
        }

        public void marcarLoteComoExpedido(long id)
        {
            
             bool noCerrar = false;
             try
             {
                 if (conexion.State == System.Data.ConnectionState.Closed)
                     conexion.Open();
                 else
                     noCerrar = true;
                 
                 string sql = "update Lotes set lotExpedido = 1 where lotNumero = " + id;
                 OleDbCommand cmd = new OleDbCommand(sql, conexion);
                 cmd.ExecuteNonQuery();
             }
             catch (Exception e)
             {
                 string error = e.Message;
             }
             finally
             {
                 if (!noCerrar)
                     conexion.Close();
             }
        }

        public void marcarLoteComoNoExpedido(int id)
        {
            bool noCerrar = false;
            try
            {
                if (conexion.State == System.Data.ConnectionState.Closed)
                    conexion.Open();
                else
                    noCerrar = true;

                string sql = "update Lotes set lotExpedido = 0 where lotNumero = " + id;
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
            finally
            {
                if (!noCerrar)
                    conexion.Close();
            }
        }


        public string obtenerNombreCliente(string id)
        {
            string nombre = "";
            bool noCerrar = false;
            try
            {
                if (conexion.State == System.Data.ConnectionState.Closed)
                    conexion.Open();
                else
                    noCerrar = true;
                
                string sql = "select empNombre from Empresas where empCodigo like ('" + id + "') " ;
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                OleDbDataReader reader;
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Object objetoRecogedor = reader["empNombre"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                        nombre = (string)reader["empNombre"];
                }
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
            finally
            {
                if (!noCerrar)
                    conexion.Close();
            }
            return nombre;
        }

        public string obtenerNombreProducto(string id)
        {
            string nombre = "";
            bool noCerrar = false;
            try
            {
                if (conexion.State == System.Data.ConnectionState.Closed)
                    conexion.Open();
                else
                    noCerrar = true;

                string sql = "select artNombre from Articulos where artCodigo like ('" + id + "') ";
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                OleDbDataReader reader;
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Object objetoRecogedor = reader["artNombre"];
                    if (objetoRecogedor.GetType() != typeof(System.DBNull))
                        nombre = (string)reader["artNombre"];
                }
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
            finally
            {
                if (!noCerrar)
                    conexion.Close();
            }
            return nombre;
        }
    
    }

    
}
